class Solution:
    def duplicateZeros(self, arr: list) -> None:
        """
        Do not return anything, modify arr in-place instead.
        """

        # 计数 0 的个数，根据题目定义，当 arr[i] 的前面有 n 个 0 ，那么最终 arr[i] 的值将出现在 arr[i + n - 1] ，如果超过数组长度，自然就不出现在数组中
        zero = 0
        for num in arr:
            if num == 0:
                zero += 1
        i = len(arr) - 1
        j = len(arr) + zero - 1

        # 从后往前遍历数组，遍历时根据当前 0 的个数情况进行元素后移
        while i >= 0 and i < j:
            if arr[i] == 0:
                # arr[i] 根据其前面的 0 的个数后移，0 自身是不计入的，但是题目会在 arr[i + 1] 的位置复制一个 0 ，那么实际这里移动的是复制出来的 0
                if j < len(arr):
                    arr[j] = arr[i]
                # 遇到的是 0 ，那么后续的元素后移距离将缩短，因为是根据 arr[i] 前有多少个 0 来决定后移多少
                j -= 1
                # 这里实际上是移动本体 0
                if j < len(arr):
                    arr[j] = arr[i]
            else:
                # arr[i] 根据其前面的 0 的个数后移
                if j < len(arr):
                    arr[j] = arr[i]
            i -= 1
            j -= 1
